[小ネタ]EC2 Image Builderでコンポーネントを実行するユーザを調べてみた
きっかけ
ImageBuilderのAmazon提供コンポーネントを調べてみると、コマンド実行時にsudoを付与しているようでした。「sudoを付与するということは、root以外のユーザで実行されている可能性があるかもしれないけど、では一体どのユーザで?」ということが気になったので、実際に調べてみました。
結論
root権限でした。
調べ方
以下ようなカスタムコンポーネントを作成し、実際にImageBuilderで実行してみました。
name: builder-check schemaVersion: 1.0 phases: - name: build steps: - name: hoge action: ExecuteBash inputs: commands: - whoami >> /tmp/hoge.log - id >> /tmp/hoge.log - pwd >> /tmp/hoge.log - cd ~ - pwd >> /tmp/hoge.log - touch /tmp/xxxxx - ls -al /tmp/ >> /tmp/hoge.log
出力されたファイルを確認してみました。
$ cat /tmp/hoge.log root uid=0(root) gid=0(root) groups=0(root) /tmp /root total 44 (中略) -rw-r--r-- 1 root root 0 Dec 16 08:28 xxxxx
わかったこと
- root権限で実行される。
- 初期ディレクトリは
/tmp
。ホームディレクトリは/root
。
コンポーネントの実行はSSMエージェントを介して行われているようで、SSMのドキュメントには以下のようにあります。ナルホドね。
SSM エージェント は、root アクセス権限 (Linux) または SYSTEM アクセス権限 (Windows) を使用して Amazon EC2 インスタンスで実行されます。
SSM エージェント を介してルートレベルコマンドへのアクセスを制限する - AWS Systems Manager
おまけ
あれ、ということはsudoいらないのでは・・・?
というわけで試してみました。
name: code-deploy-agent description: Install CodeDeploy agent. schemaVersion: 1.0 phases: - name: build steps: - name: install action: ExecuteBash inputs: commands: - yum update -y - yum install ruby wget -y - wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install -O /tmp/install -nv - chmod +x /tmp/install - /tmp/install auto - rm -f /tmp/install
特にトラブルなく、AMIの作成が完了しました。
しかし、sudoを利用することでログが残ります。ImageBuilderはコンポーネント単位でスクリプト化して実行しています。そのため、内部でどのようなコマンドを実行したか残したい場合に履歴を残すことができます。 「CodeDeployのインストール」「Apacheのインストール」の2つのモジュールを、それぞれsudo有りと無しで試した場合のログです。
sudo有りの場合の/var/log/secure
Dec 17 05:35:18 ip-******** useradd[2527]: new group: name=ec2-user, GID=1000 Dec 17 05:35:18 ip-******** useradd[2527]: new user: name=ec2-user, UID=1000, GID=1000, home=/home/ec2-user, shell=/bin/bash Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to group 'adm' Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to group 'wheel' Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to group 'systemd-journal' Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'adm' Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'wheel' Dec 17 05:35:18 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'systemd-journal' Dec 17 05:35:18 ip-******** sshd[2702]: Server listening on 0.0.0.0 port 22. Dec 17 05:35:18 ip-******** sshd[2702]: Server listening on :: port 22. Dec 17 05:38:10 ip-******** sudo: root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/tmp/imagebuilder/TaskOrchestratorAndExecutor/awstoe ru n -d /tmp/imagebuilder/code-deploy-agent_********,/tmp/imagebuilder/apache-2_4_******** -p build,validate Dec 17 05:38:10 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0) Dec 17 05:38:10 ip-******** sudo: root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/yum update -y Dec 17 05:38:10 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0) Dec 17 05:38:29 ip-******** sudo: pam_unix(sudo:session): session closed for user root Dec 17 05:38:29 ip-******** sudo: root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/yum install ruby wget -y Dec 17 05:38:29 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0) Dec 17 05:38:31 ip-******** sudo: pam_unix(sudo:session): session closed for user root Dec 17 05:38:32 ip-******** sudo: root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/tmp/install auto Dec 17 05:38:32 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0) Dec 17 05:38:36 ip-******** sudo: pam_unix(sudo:session): session closed for user root Dec 17 05:38:36 ip-******** sudo: root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/yum update -y Dec 17 05:38:36 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0) Dec 17 05:38:37 ip-******** sudo: pam_unix(sudo:session): session closed for user root Dec 17 05:38:37 ip-******** sudo: root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/yum install httpd -y Dec 17 05:38:37 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0) Dec 17 05:38:38 ip-******** groupadd[11769]: group added to /etc/group: name=apache, GID=48 Dec 17 05:38:38 ip-******** groupadd[11769]: group added to /etc/gshadow: name=apache Dec 17 05:38:38 ip-******** groupadd[11769]: new group: name=apache, GID=48 Dec 17 05:38:38 ip-******** useradd[11774]: new user: name=apache, UID=48, GID=48, home=/usr/share/httpd, shell=/sbin/nologin Dec 17 05:38:38 ip-******** sudo: pam_unix(sudo:session): session closed for user root Dec 17 05:38:38 ip-******** sudo: root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/systemctl enable httpd.service Dec 17 05:38:38 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0) Dec 17 05:38:39 ip-******** sudo: pam_unix(sudo:session): session closed for user root Dec 17 05:38:39 ip-******** sudo: pam_unix(sudo:session): session closed for user root Dec 17 05:38:54 ip-******** sudo: root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/shred -zuf /etc/sudoers.d/90-cloud-init-users
sudo無しの場合の/var/log/secure
Dec 16 10:05:35 ip-******** useradd[2527]: new group: name=ec2-user, GID=1000 Dec 16 10:05:35 ip-******** useradd[2527]: new user: name=ec2-user, UID=1000, GID=1000, home=/home/ec2-user, shell=/bin/bash Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to group 'adm' Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to group 'wheel' Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to group 'systemd-journal' Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'adm' Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'wheel' Dec 16 10:05:35 ip-******** useradd[2527]: add 'ec2-user' to shadow group 'systemd-journal' Dec 16 10:05:35 ip-******** sshd[2703]: Server listening on 0.0.0.0 port 22. Dec 16 10:05:35 ip-******** sshd[2703]: Server listening on :: port 22. Dec 16 10:08:20 ip-******** sudo: root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/tmp/imagebuilder/TaskOrchestratorAndExecutor/awstoe run -d /tmp/imagebuilder/code-deploy-agent_********,/tmp/imagebuilder/apache-2_4_******** -p build,validate Dec 16 10:08:20 ip-******** sudo: pam_unix(sudo:session): session opened for user root by (uid=0) Dec 16 10:08:47 ip-******** groupadd[11756]: group added to /etc/group: name=apache, GID=48 Dec 16 10:08:47 ip-******** groupadd[11756]: group added to /etc/gshadow: name=apache Dec 16 10:08:47 ip-******** groupadd[11756]: new group: name=apache, GID=48 Dec 16 10:08:47 ip-******** useradd[11761]: new user: name=apache, UID=48, GID=48, home=/usr/share/httpd, shell=/sbin/nologin Dec 16 10:08:48 ip-******** sudo: pam_unix(sudo:session): session closed for user root Dec 16 10:09:06 ip-******** sudo: root : TTY=unknown ; PWD=/tmp ; USER=root ; COMMAND=/bin/shred -zuf /etc/sudoers.d/90-cloud-init-users
sudo有りの場合、スクリプトの内部でどのようなコマンドが発行されたかしっかりと分かりますね。 この特性を覚えておくとなにかの役に立つかもしれません。
それでは!